package lc.q1_50;


import java.io.FileInputStream;
import java.util.*;

/**
 * 36. 有效的数独
 * 判断一个 9x9 的数独是否有效。只需要根据以下规则，验证已经填入的数字是否有效即可。
 *
 * 数字 1-9 在每一行只能出现一次。
 * 数字 1-9 在每一列只能出现一次。
 * 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
 *
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/valid-sudoku
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Q36 {
    public boolean isValidSudoku(char[][] board) {
        int[][] hs = new int[9][10];
        int[][] vs = new int[9][10];
        int[][] ks = new int[9][10];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                final char c = board[i][j];
                if (c != '.') {
                    int num = c - '0';
                    hs[i][num]++;
                    vs[j][num]++;
                    final int[] k = ks[i / 3 * 3 + j / 3];
                    k[num]++;
                    if (hs[i][num] + vs[j][num]+ k[num] > 3) {
                        return false;
                    }
                }
            }
        }
        return true;
    }

    public static void main(String[] args) throws Exception{
        try (FileInputStream fis = new FileInputStream("Q36_input.txt")) {
            final Scanner scanner = new Scanner(fis);
            scanner.nextLine();
            char[][] chars = new char[9][];
            for (int i = 0; i < 9; i++) {
                final String line = scanner.nextLine();
                // 如何提取所有的字符？
                final String s = line.replaceAll("[^\\d.]", "");
                chars[i] = Arrays.copyOf(s.toCharArray(), 9);
            }
            final Q36 q36 = new Q36();
            final boolean validSudoku = q36.isValidSudoku(chars);
            System.out.println(validSudoku);
        }
    }

}
